Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Re: Seeking inside-out object implementations

by Ovid (Cardinal)
on Dec 06, 2005 at 20:09 UTC ( #514627=note: print w/replies, xml ) Need Help??

in reply to Seeking inside-out object implementations

You can look at my Class::BuildMethods. It's extremely lightweight. The nice thing about it is you can slowly convert your objects to inside-out objects regardless of the implementation you currently use. This gives you a migration path.

use Data::UUID; use Class::BuildMethods 'name', rank => { default => 'private' }, age => { validate => sub { my ($self, $age) = @_; die "Must be 18 or over" unless $age >= 18; }, }, id => { default => Data::UUID->new->get_str, validate => sub { die "id() is readonly" } }; sub new { bless [], shift } sub foo { my $self = shift; return $self->[0] unless @_; # lots of horribly complicated code $self->[0] = shift; return $self; }

In the above example, you have a blessed array reference, but it can be a blessed typeglob, hashref, whatever. You can also add your own methods which are independent of the inside-out attributes that BuildMethods defines. This allows you to take an existing class and gradually encapsulate methods one at a time.


New address of my CGI Course.

Replies are listed 'Best First'.
Re^2: Seeking inside-out object implementations
by xdg (Monsignor) on Dec 06, 2005 at 23:07 UTC

    Wow -- I didn't realize you what you were doing under the hood before. I browsed the code. If I understand it correctly in my quick skim -- you're using the inside-out object technique, but storing all the accessor data in a lexical in the Class::BuildMethods file scope, keyed off the package that imported Class::BuildMethods and the instance refaddr. That's an extra hash lookup versus handwritten inside-out objects, but I guess lighter-weight overall than Class::Std without all the constructor crud.

    However, I think it will still be subject to the thread/winfork and serialization issues. That probably ought to noted in the docs and you might want to consider using CLONE as noted in Threads and fork and CLONE, oh my! and marking it as safe for 5.8 only.

    Still, that's a great example of what can be achieved with independence from the underlying implementation -- and why that's a useful feature. I'll probably use it as an example in the seminar.


    Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

      You're right that I should probably note issues with threading and forking. I've used fork in Perl only a few times and I've only used threads in Java as threaded Perl has never been terribly robust. As a result, since these aren't that common in Perl, I tend not to think about them.


      New address of my CGI Course.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://514627]
LanX blame Canada!
[Discipulus]: to crash is not the default behaviour of IE? ;=)
[Discipulus]: so every library (js) to sdelect and modify the id parameters can be good.
[Discipulus]: I never understood something: I can on the fly modify the XML structure of the SVG using for example XML::Twig ?
[Corion]: Discipulus: If you want to rewrite the SVG, then yes, something like XML::Twig should be enough. I would try to not modify the SVG but only modify the display, but so far I haven't convinced IE to change the style...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (11)
As of 2017-03-23 09:36 GMT
Find Nodes?
    Voting Booth?
    Should Pluto Get Its Planethood Back?

    Results (285 votes). Check out past polls.