Flail::Thing - A structured thing


  Time-stamp: <2006-12-01 16:35:16>
  $Id:,v 1.3 2006/04/26 03:52:03 attila Exp $


  package Something;
  use base qw(Flail::Thing);
  sub _struct {
      return shift->SUPER::_struct,
              ( my_field_1 => default_value,
                my_field_2 => default_value, );

  package main;
  my $obj = Something->new(my_field_1 => 1, my_field_2 => 'blah');
  print $obj->as_string."\n";  ## can turn them into strings
  print $obj->my_field_2."\n"; ## print the value of a field
  $obj->my_field_1(3);         ## set my_field_1 to 3

  sub terlet {
    my($obj,@changes) = @_;
    while (@changes) {
      my($name,$val) = splice(@changes,0,2);
      print "$obj $name => $val\n";
    return undef;

  $obj->FLUSH(\&terlet);      ## will be called with: my_field_1 => 3


This is a generic thing. It has slots. Slots can contain other things, but swizzling and unswizzling don't happen automagically.

It is derived from a class I wrote a long time ago called just plain old Thing. I am pulling it into Flail starting in version 0.2.0.

Things can have options. Options are not slots, they are used to specify optional attributes of an object regardless of its particular structure or behavior. For instance, the autoflush attribute can be used to tell the DESTROY method in Thing whether or not to flush changes to an object that is being garbage-collected by the Perl interpreter.


Return a human-readable string that represents this object.

eval ...

Perform some arbitrary "evaluation" function as per the semantics of the object.

FLUSH $callback,@args

Invoke the callback function with $self, and one $attr => $val pair. Each invocation represents one state change that has not yet been stored presistently. The callback's job is to store this state change, in whatever way makes sense for the object.

LOAD $callback,@args...

Invoked to load state from whatever persistent store this object uses. We are passed a list of slots that are missing.

OPTION $opt => $newval

Check optional attributes for this object, or set them.


Sean Levy <>


(C) 2002-2006 by Sean Levy <>. all rights reserved.

This code is released under a BSD license. Please see the LICENSE file that came with the source distribution or visit