in reply to Re: Howto keep private methods private?
in thread Howto keep private methods private?
That approach to method privacy is fundementally broken, consider this:
This is incorrect behavior, private methods should not block a perfectly valid (inherited) public method from being called. The only way to get proper behavior is to not add the private method to the class's symbol table, which means doing it like so:package Foo; sub new { bless {} => shift } sub baz { "Hello from Foo::baz" } package Bar; use base 'Foo'; sub baz { # baz is private ... my $caller = caller; croak "Can't call private method from $caller" if $caller ne __PACKAGE__; "Hello from Bar::baz (private)"; } sub call_baz { (shift)->baz } package main; Bar->new->baz; # BOOM!
package Foo; sub new { bless {} => shift } sub baz { "Hello from Foo::baz" } package Bar; use base 'Foo'; my $baz = sub { # baz is private ... my $caller = caller; croak "Can't call private method from $caller" if $caller ne __PACKAGE__; "Hello from Bar::baz (private)"; }; sub call_baz { (shift)->$baz() } package main; Bar->new->baz; # no more BOOM!
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: Howto keep private methods private?
by ikegami (Patriarch) on Sep 14, 2007 at 16:01 UTC | |
by lodin (Hermit) on Sep 14, 2007 at 16:39 UTC | |
by stvn (Monsignor) on Sep 14, 2007 at 21:04 UTC | |
|
Re^3: Howto keep private methods private?
by lodin (Hermit) on Sep 14, 2007 at 16:25 UTC | |
|
Re^3: Howto keep private methods private?
by kyle (Abbot) on Sep 14, 2007 at 15:35 UTC | |
by stvn (Monsignor) on Sep 14, 2007 at 20:57 UTC |