On Wed, Sep 03, 2008 at 10:56:00PM +0300, Shmuel Fomberg wrote:
> Hi All.
> 
> I have this module on CPAN, Data::ParseBinary.
> now I want to add a library of pre-prepared format. For example, a 
> parser/builder for BMP files.
> The question is, how do I call it?
> some options that I though about:
> have module named Data::ParseBinary::lib::GraphicsBMP that export 
> function named GetGraphicBMP, or a variable $GraphicBMP.
> maybe I shoud skip the "lib" level, and mass all the files under the 
> same directory, creating a Data::ParseBinary::GraphicsBMP module.
> another possibility is to make a Data::ParseBinary::lib module, that 
> export function GraphicBMP().
> And final option is to make the main module to export a function, say 
> ParseLibrary, and let users do:
> $parser = ParseLibrary("Graphic-BMP");
> or something like that. or maybe:
> $parser = ParseLibrary->Graphic->BMP;
> 
> What do you say? What would you have done?
> Shmuel.
> 
        I would use an abstraction pattern and do something like:

package Data::ParseBinary;

sub new {
  my($class, $package, $init) = @_;
  my($concrete_package) = "Data::ParseLibrary::${package}";
  eval qq{ use $concrete_package; };
  die "Couldn't use $concrete_package, $@" if $@;
  my($self) = $concrete_package->new($init);
  return $self;
}

package Data::ParseBinary::Graphic::BMP;

sub new {
  my($class, $self) = @_;
  $self = {} unless $self;
  bless $self, $class;
  return $self;
}

# GetGraphicBMP is redundant, because it is in the GraphicsBMP lib.
sub get {
  my($self, $file) = @_;
  ....
  return $bmp;
}

package main;
# The main part of the program, right?
$parser = ParseLibrary->new("Graphic::BMP");
$bmp = $parser->get($bmp_file);
# Get some other kind of file.
$jpeg = ParseLibrary->new("Graphic::JPEG")->get($jpeg_file);

...


        Austin

Reply via email to