NAME

Class::Monadic - Provides monadic methods (a.k.a. singleton methods)

VERSION

This document describes Class::Monadic version 0.03.

SYNOPSIS

use Class::Monadic;

my $ua1 = LWP::UserAgent->new();

Class::Monadic->initialize($ua1)->add_method(
	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_field(qw(x y z));
$ua1->set_x(42);
print $ua1->get_x(); # => 42

# per-object fields with validation
monadic($ua1)->add_field(
	foo => qr/^\d+$/,
	bar => [qw(apple banana)],
	qux => \&is_something,
);

DESCRIPTION

Class::Monadic provides per-object classes, monadic classes. It is also known as singleton classes in other languages, e.g. Ruby.

Monadic classes is used in order to define monadic methods, i.e. per-object methods (a.k.a. singleton methods), which are only available at the specific 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.

INTERFACE

Exportable functions

monadic($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 methods

Class::Monadic->initialize($object)

Specializes $object to have a monadic class, and returns Class::Monadic instance, $meta.

Instance methods

$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->add_method(%name_code_pairs)

Adds methods into the monadic class.

$meta->add_field(@field_names)

Adds fields and accessors named get_$name/set_$name into the monadic class.

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, whareas Object::Accessor is only available in classes that is-a Object::Accessor.

$meta->add_modifier($type, @method_names, $code)

Adds method modifiers to specific methods, using Class::Method::Modifiers::Fast.

$type is must be before, around or 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.

CAVEATS

You cannot serialize objects with monadic classes, because its monadic features usually includes code references.

Patches are welcome.

DEPENDENCIES

Perl 5.8.1 or later.

Data::Util.

Hash::FieldHash.

BUGS

No bugs have been reported.

Please report any bugs or feature requests to the author.

SEE ALSO

Object::Accessor.

Class::Component.

Class::MOP.

AUTHOR

Goro Fuji (gfx) <gfuji(at)cpan.org>.

LICENSE AND COPYRIGHT

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.