|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrew Alakozow 2:5061/6 27 Oct 2005 12:26:30 To : Andrey Chernomyrdin Subject : Re: Q: Plugins -------------------------------------------------------------------------------- AC> - --[ main.pl ]-- - AC> package main; Это не нужно, 'main' - пакет по умолчинию. AC> use strict; AC> use Application; AC> use Plugin qw(Plugin::MyPlugin1 Plugin::MyPlugin2); Я бы вместо Application и Plugin сделал один MyParser (еще лучше, чтобы из названия было понятно, какие данные разбираются) и список "плагинов" вынес в конструктор. package MyParser; use strict; sub new { my $class = shift; my $self = {}; bless ($self, $class); foreach my $plugin (@_) { eval {require "$plugin.pm"}; die "Error loading $plugin: $@" if $@; # или warn push @{$self->{plugins}}, $plugin; } return $self; } sub parse { my $self = shift; my $line = shift; foreach my $plug (@{$self->{plugins}}){ $plug->do($line) if $plug->match($line); # do и match можно объединить в один метод } } AC> - --[ Plugin::Base.pm ]-- - AC> package Plugin::Base; AC> use strict; AC> our $VERSION = '1.0'; AC> sub is_plugin { 1 } AC> sub name { __PACKAGE__ } sub name { ref $_[0] } # можно наследовать AC> - --[ Plugin::MyPlugin1 ]-- - AC> package Plugin::MyPlugin1; package PlugBar; use strict; sub match { $_[1] =~ /bar/ } sub do {print "Bar!\n"} 1; Использовать так: use MyParser; use strict; my $parser = MyParser->new(qw(PlugBar PlugFoo)); while (<>){ $parser->parse($_); } AC> Все в принципе работает, осталось пара _но_ которая раздражает: AC> Хотелось-бы что-бы избавится от метода parent внутри plugin-ов, AC> как-нибудь это можно сделать ? Пользоваться встроенными сресдтвами поддержки ООП. Андрей. --- Microsoft Outlook Express 6.00.2900.2180 * Origin: Life In The Dark (2:5061/6) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/4490380d8f201.html, оценка из 5, голосов 10
|