Class::Monadic - Provides monadic methods (a.k.a. singleton methods)
This document describes Class::Monadic version 0.04.
use Class::Monadic; my $ua1 = LWP::UserAgent->new(); Class::Monadic->initialize($ua1)->add_methods( hello => sub{ print "Hello, world!\n" }, ); $ua1->hello(); # => Hello, world! my $ua2 = LWP::UserAgent->new(); $ua2->foo(); # throws "Can't locate object method ..." # because foo() is $ua1 specific. # import a syntax sugar to make an object monadic use Class::Monadic qw(monadic); monadic($ua1)->inject_base(qw(SomeComponent OtherComponent)); # now $ua1 is-a both SomeComponent and OtherComponent # per-object fields monadic($ua1)->add_fields(qw(x y z)); $ua1->set_x(42); print $ua1->get_x(); # => 42 # per-object fields with validation monadic($ua1)->add_fields( foo => qr/^\d+$/, bar => [qw(apple banana)], qux => \&is_something, );
Class::Monadic provides per-object classes, monadic classes. It is also known as singleton classes in other languages, e.g. Ruby.
Class::Monadic
Ruby
Monadic classes is used in order to define monadic methods, i.e. per-object methods (a.k.a. singleton methods), which are available only at the object they are defined into.
All the meta data that Class::Monadic deals with are outside the object associated with monadic classes, so this module does not depend on the implementation of the object.
Specializes $object to have a monadic class, and returns Class::Monadic instance, $meta.
This is a syntax sugar to Class::Monadic->initialize($object).
Class::Monadic->initialize($object)
$meta->name
Returns the name of the monadic class.
$meta->id
Returns the ID of the monadic class.
Its real class name is $meta->name . '::' . $meta->id;
$meta->name . '::' . $meta->id
$meta->add_method(%name_code_pairs)
$meta->add_methods(%name_code_pairs)
Adds methods into the monadic class.
$meta->add_field(@field_names)
$meta->add_fields(@field_names)
Adds field accessors named get_$name/set_$name into the monadic class. Setters are chainable like $obj->set_foo(42)->set_bar(3.14).
$obj->set_foo(42)->set_bar(3.14)
These fields are not stored in the object. Rather, stored in its class.
This feature is like what Object::Accessor provides, but Class::Monadic is available for all the classes existing, whereas Object::Accessor is only available in classes that is-a Object::Accessor.
Object::Accessor
$meta->add_modifier($type, @method_names, $code)
Adds method modifiers to specific methods, using Class::Method::Modifiers::Fast.
Class::Method::Modifiers::Fast
$type is must be before, around or after.
before
around
after
Example:
monadic($obj)->add_modifier(before => foo => sub{ ... }); monadic($obj)->add_modifier(around => qw(foo bar baz), sub{ my $next = shift; my(@args) = @_; # ... return &{$next}; } ); monadic($obj)->add_modifier(after => xyzzy => sub{ ... });
See also Class::Method::Modifiers::Fast.
$meta->inject_base(@component_classes)
Adds @component_classes into the is-a hierarchy of the monadic class.
$meta->bless($another_object)
Copies all the features of $meta into $another_object.
Although you can clone objects with monadic class, you cannot serialize these objects because its monadic features usually includes code references.
Patches are welcome.
Perl 5.8.1 or later.
Data::Util.
Data::Util
Hash::FieldHash.
Hash::FieldHash
Class::Method::Modifiers::Fast.
No bugs have been reported.
Please report any bugs or feature requests to the author.
Object::Accessor.
Class::Component.
Class::MOP.
Goro Fuji (gfx) <gfuji(at)cpan.org>.
Copyright (c) 2009, Goro Fuji (gfx). Some rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Class::Monadic, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Class::Monadic
CPAN shell
perl -MCPAN -e shell install Class::Monadic
For more information on module installation, please visit the detailed CPAN module installation guide.