home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _5dd1cd1f75577f1f4747baf638935ae9 < prev    next >
Text File  |  2000-03-23  |  23KB  |  497 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>POE::Session - POE State Machine</TITLE>
  5. <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> POE::Session - POE State Machine</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  25.     <LI><A HREF="#exported constants">EXPORTED CONSTANTS</A></LI>
  26.     <LI><A HREF="#public methods">PUBLIC METHODS</A></LI>
  27.     <LI><A HREF="#state parameters">STATE PARAMETERS</A></LI>
  28.     <LI><A HREF="#custom events and parameters">CUSTOM EVENTS AND PARAMETERS</A></LI>
  29.     <LI><A HREF="#predefined events and parameters">PREDEFINED EVENTS AND PARAMETERS</A></LI>
  30.     <LI><A HREF="#about states' return values">ABOUT STATES' RETURN VALUES</A></LI>
  31.     <LI><A HREF="#see also">SEE ALSO</A></LI>
  32.     <LI><A HREF="#bugs">BUGS</A></LI>
  33.     <LI><A HREF="#authors & copyrights">AUTHORS & COPYRIGHTS</A></LI>
  34. </UL>
  35. <!-- INDEX END -->
  36.  
  37. <HR>
  38. <P>
  39. <H1><A NAME="name">NAME</A></H1>
  40. <P>POE::Session - POE State Machine</P>
  41. <P>
  42. <HR>
  43. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  44. <UL>
  45. <LI>Linux</LI>
  46. <LI>Solaris</LI>
  47. <LI>Windows</LI>
  48. </UL>
  49. <HR>
  50. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  51. <PRE>
  52.   # Original inline session constructor:
  53.   new POE::Session(
  54.     name1 => \&name1_handler, # \&name1_handler is the "name1" state
  55.     name2 => sub { ... },     # anonymous is the "name2" state
  56.     \@start_args,             # ARG0..ARGn for the the _start state
  57.   );</PRE>
  58. <PRE>
  59.   # Original package session constructor:
  60.   new POE::Session(
  61.     $package, [ 'name1',      # $package->name1() is the "name1" state
  62.                 'name2',      # $package->name2() is the "name2" state
  63.               ],
  64.     \@start_args,             # ARG0..ARGn for the start _start state
  65.   );</PRE>
  66. <PRE>
  67.   # Original object session constructor:
  68.   my $object1 = new SomeObject(...);
  69.   my $object2 = new SomeOtherObject(...);
  70.   new POE::Session(
  71.     # $object1->name1() is the "name1" state
  72.     # $object1->name2() is the "name2" state
  73.     $object1 => [ 'name1', 'name2' ],
  74.     # $object2->name1() is the "name3" state
  75.     # $object2->name2() is the "name3" state
  76.     $object2 => [ 'name3', 'name4' ],
  77.     \@start_args,             # ARG0..ARGn for the _start state
  78.   );</PRE>
  79. <PRE>
  80.   # New constructor:
  81.   create POE::Session(
  82.     # ARG0..ARGn for the session's _start handler
  83.     args => \@args,
  84.     inline_states  => { state1 => \&handler1,
  85.                         state2 => \&handler2,
  86.                         ...
  87.                       },
  88.     object_states  => [ $objref1 => \@methods1,
  89.                         $objref2 => { state_name_1 => 'method_name_1',
  90.                                       state_name_2 => 'method_name_2',
  91.                                     },
  92.                         ...
  93.                       ],
  94.     package_states => [ $package1 => \@function_names_1,
  95.                         $package2 => { state_name_1 => 'method_name_1',
  96.                                        state_name_2 => 'method_name_2',
  97.                                      },
  98.                         ...
  99.                       ],
  100.     options => \%options,
  101.   );</PRE>
  102. <PRE>
  103.   # Set or clear some session options:
  104.   $session->option( trace => 1, default => 1 );</PRE>
  105. <P>
  106. <HR>
  107. <H1><A NAME="description">DESCRIPTION</A></H1>
  108. <P>(Note: Session constructors were changed in version 0.06.  Processes
  109. no longer support multiple kernels.  This made the $kernel parameter
  110. to session constructors obsolete, so it was removed.)</P>
  111. <P>POE::Session is a generic state machine class.  Session instances are
  112. driven by state transition events, dispatched by POE::Kernel.</P>
  113. <P>Sessions are POE's basic, self-contained units of program execution.
  114. They are equivalent to operating system processes or threads.  As part
  115. of their creation, sessions register themselves with the process'
  116. Kernel instance.  The kernel will keep track of their resources, and
  117. perform garbage collection at appropriate times.</P>
  118. <P>
  119. <HR>
  120. <H1><A NAME="exported constants">EXPORTED CONSTANTS</A></H1>
  121. <P>POE::Session exports constants for states' parameters.  The constants
  122. are discussed down in the STATE PARAMETERS section.</P>
  123. <P>
  124. <HR>
  125. <H1><A NAME="public methods">PUBLIC METHODS</A></H1>
  126. <UL>
  127. <LI>
  128. new
  129. <P>POE::Session::new() is the original, highly overloaded constructor
  130. style.  It creates a new POE::Session instance, populated with states
  131. given as its parameters.</P>
  132. <P>A reference to the new session will be given to the process' Kernel
  133. instance.  The kernel will manage the session and its resources, and
  134. it expects perl to destroy the session when it releases its reference.</P>
  135. <P>The constructor will also return a reference to the new session.  This
  136. reference may be used directly, but keeping a copy of it will prevent
  137. perl from garbage collecting the session when the kernel is done with
  138. it.  Some uses for the session reference include posting ``bootstrap''
  139. events to the session or manipulating the session's options with its
  140. <CODE>option()</CODE> method.</P>
  141. <P>Some people consider the <CODE>new()</CODE> constructor awkward, or ``action at a
  142. distance''.  POE provides a semantically ``sweeter'' Kernel method,
  143. POE::Kernel::session_create() for these people.  Please note, however,
  144. that session_create is depreciated as of version 0.06_09, since
  145. POE::Session has become a proper object.</P>
  146. <P>POE::Session::new() accepts pairs of parameters, with one exception.
  147. The first parameter in the pair determines the pair's type.  The pairs
  148. may be used interchangeably:</P>
  149. <P>Inline states are described by a scalar and a coderef.  The scalar is
  150. a string containing the state's name, which is also the name of the
  151. event that will trigger the state.  The coderef is the Perl subroutine
  152. that will be called to handle the event.</P>
  153. <PRE>
  154.   new POE::Session( event_name => \&state_handler );</PRE>
  155. <P>Object states are described by an object reference and a reference to
  156. an array of method names.  The named methods will be invoked to handle
  157. similarly named events.</P>
  158. <PRE>
  159.   my $object = new Object;
  160.   new POE::Session( $object => [ qw(method1 method2 method3) ] );</PRE>
  161. <P>Package states are described by a package name and a reference to an
  162. array of subroutine names.  The subroutines will handle events with
  163. the same names.  If two or more packages are listed in the
  164. constructor, and the packages have matching subroutine names, then the
  165. last one wins.</P>
  166. <PRE>
  167.   new POE::Session( 'Package' => [ 'sub1', 'sub2', 'sub3' ] );</PRE>
  168. <P>Sessions may use any combination of Inline, Object and Package states:</P>
  169. <PRE>
  170.   my $object = new Object;
  171.   new POE::Session( event_name => \&state_handler,
  172.                     $object   => [ qw(method1 method2 method3) ],
  173.                     'Package' => [ 'sub1', 'sub2', 'sub3' ]
  174.                   );</PRE>
  175. <P>There is one parameter that isn't part of a pair.  It is a stand-alone
  176. array reference.  The contents of this arrayref are sent as arguments
  177. to the session's <STRONG>_start</STRONG> state.</P>
  178. <P></P>
  179. <LI>
  180. create
  181. <P>POE::Session::create() is a new constructor style.  It does not use
  182. parameter overloading and DWIM to discern different session types.  It
  183. also supports the ability to set options in the constructor, unlike
  184. POE::Session::new().</P>
  185. <P>Please see the SYNOPSIS for <CODE>create()</CODE> usage.</P>
  186. <P></P>
  187. <LI>
  188. option
  189. <P>POE::Session::option() stores, fetches or removes a session's option.
  190. Options are similar to environment variables.</P>
  191. <P>The <CODE>option()</CODE> method's behavior changed in version 0.06_09.  It now
  192. supports fetching option values without changing or deleting the
  193. option.</P>
  194. <PRE>
  195.   $session->option( 'name1' );         # Fetches option 'name1'
  196.   $session->option( name2 => undef );  # Deletes option 'name2'
  197.   $session->option( name3 => 1,        # Sets name3...
  198.                     name4 => 2         # ... and name4.
  199.                   );</PRE>
  200. <P>Actually, <CODE>option()</CODE> always returns the values of the options its
  201. passed.  If more than one option is supplied in the parameters, then
  202. <CODE>option()</CODE> returns a reference to a hash containing names and previous
  203. values.  If a single option is specified, then <CODE>option()</CODE> returns its
  204. value as a scalar.</P>
  205. <P>The <CODE>option()</CODE> method can only accept more than one option name while
  206. storing or deleting.  POE::Session::option() only changes the options
  207. that are present as parameters.  Unspecified options are left alone.</P>
  208. <P>For example:</P>
  209. <PRE>
  210.   $session->option( trace => 1, default => 0 );</PRE>
  211. <P>Logical values may be sent as either 1, 0, 'on', 'off', 'yes', 'no',
  212. 'true' or 'false'.  Stick with 1 and 0, though, because somebody
  213. somewhere won't like the value translation and will request that it be
  214. removed.</P>
  215. <P>These are the options that POE currently uses internally.  Others may
  216. be added later.</P>
  217. <UL>
  218. <LI>
  219. trace
  220. <P>Accepts a logical true/false value.  This option enables or disables a
  221. trace of events as they're dispatched to states.</P>
  222. <P></P>
  223. <LI>
  224. default
  225. <P>Accepts a logical true/false value.  When the ``default'' option is
  226. enabled, POE will warn and confess about events that arrive but can't
  227. be dispatched.  Note: The ``default'' option will not do anything if the
  228. session has a <STRONG>_default</STRONG> state, because then every event can be
  229. dispatched.</P>
  230. <P></P></UL>
  231. <LI>
  232. ID
  233. <P>POE::Session::ID() returns this session's unique ID, as maintained by
  234. POE::Kernel.  It's a shortcut for $kernel->ID_session_to_id($session).</P>
  235. <P></P></UL>
  236. <P>
  237. <HR>
  238. <H1><A NAME="state parameters">STATE PARAMETERS</A></H1>
  239. <P>State parameters changed in version 0.06.  Before 0.06, inline
  240. handlers received different parameters than object and package
  241. handlers.  The call signatures have been unified in version 0.06.
  242. This breaks programs written with POE 0.05 or earlier.  Thankfully,
  243. there aren't many.</P>
  244. <P>To prevent future breakage, POE::Session now exports constants for
  245. parameters' offsets into @_.  Programs that use the constants are
  246. guaranteed not to break whenever states' call signatures change.  Or,
  247. if parameters are removed, programs will break at compile time rather
  248. than mysteriously failing at runtime.</P>
  249. <P>Parameters may be used discretely:</P>
  250. <PRE>
  251.   $_[KERNEL]->yield('next_state');</PRE>
  252. <P>If several parameters are needed multiple times, it may be easier (and
  253. faster) to assign them to lexicals all at once with an array slice:</P>
  254. <PRE>
  255.   my ($kernel, $operation, $errnum, $errstr) =
  256.      @_[KERNEL, ARG0, ARG1, ARG2];</PRE>
  257. <P>The parameter constants are:</P>
  258. <UL>
  259. <LI>
  260. OBJECT
  261. <P>The value in $_[OBJECT] is dependent on how the state was defined.  It
  262. is undef for inline states.  For object states, it contains a
  263. reference to the object that owns the method being called.  For
  264. package states, it contains the name of the package the subroutine
  265. exists in.</P>
  266. <P></P>
  267. <LI>
  268. KERNEL
  269. <P>$_[KERNEL] is a reference to the kernel that is managing this session.
  270. It exists for times when $poe_kernel isn't available.  $_[KERNEL] is
  271. recommended over $poe_kernel in states.  They may be different at some
  272. point.</P>
  273. <P></P>
  274. <LI>
  275. SESSION
  276. <P>$_[SESSION] is a reference to the current POE session.  It is included
  277. mainly as a parameter to POE::Kernel methods, and for manipulating
  278. session options.</P>
  279. <P></P>
  280. <LI>
  281. HEAP
  282. <P>$_[HEAP] is a reference to a hash set aside for each session to store
  283. its global data.  Information stored in the heap will be persistent
  284. between states, for the life of the session.</P>
  285. <P>POE will destroy the heap when its session stops, but it will not walk
  286. the heap and make sure that circular references are broken.
  287. Developers are expected to do any special heap cleanup in the
  288. session's <STRONG>_stop</STRONG> state.</P>
  289. <P>Support for using $_[HEAP] (formerly known as $me or $namespace) as an
  290. alias for $_[SESSION] in Kernel method calls is depreciated, starting
  291. in version 0.06.  It will be removed after version 0.07.</P>
  292. <P></P>
  293. <LI>
  294. STATE
  295. <P>$_[STATE] is the name of the state being invoked.  In most cases, this
  296. will be the name of the event that caused this handler to be called.
  297. In some cases though, most notably with <STRONG>_default</STRONG> and <STRONG>_signal</STRONG>,
  298. the state being invoked may not match the event being dispatched.
  299. (Predictably enough, it will be _default or _signal).  You can find
  300. out the original event name for <STRONG>_default</STRONG> (see the <STRONG>_default</STRONG>
  301. event's description).  The <STRONG>_signal</STRONG> event includes the signal name
  302. that caused it to be posted.</P>
  303. <P></P>
  304. <LI>
  305. SENDER
  306. <P>$_[SENDER] is a reference to the session that sent the event.  It is
  307. suitable as a destination for responses.  Please be careful about
  308. deadlocks is using POE::Kernel::call() in both directions.</P>
  309. <P></P>
  310. <LI>
  311. ARG0..ARG9
  312. <P>@_[ARG0..ARG9] are the first ten elements of @args, as passed to the
  313. POE::Kernel post(), call(), yield(), <A HREF="../../../lib/Pod/perlfunc.html#item_alarm"><CODE>alarm()</CODE></A> and <CODE>delay()</CODE> methods.  If
  314. more than ten items are needed, they may be referenced as
  315. $_[ARG9+1..], but it would be more efficient to pass them all as an
  316. array reference in $_[ARG0].</P>
  317. <P>Another way to grab the arguments, no matter how many there are, is:</P>
  318. <PRE>
  319.   my @args = @_[ARG0..$#_];</PRE>
  320. <P></P></UL>
  321. <P>
  322. <HR>
  323. <H1><A NAME="custom events and parameters">CUSTOM EVENTS AND PARAMETERS</A></H1>
  324. <P>Events that aren't prefixed with leading underscores may have been
  325. defined by the state machines themselves or by Wheel instances the
  326. machines are using.</P>
  327. <P>In almost all these cases, the event name should be mapped to a state
  328. in the POE::Session constructor.  Finding the event's source may be
  329. more difficult.  It could come from a Wheel in the same session, or
  330. one of the &kernel calls.  In the case of inter-session communication,
  331. it may even come from outside the session.</P>
  332. <P>
  333. <HR>
  334. <H1><A NAME="predefined events and parameters">PREDEFINED EVENTS AND PARAMETERS</A></H1>
  335. <P>POE reserves some event names for internal and standard use.  All its
  336. predefined events begin with an underscore, and future ones will too.
  337. It may be wise to avoid leading underscores in your own event names.</P>
  338. <P>Every predefined event is accompanied by the standard OBJECT, KERNEL,
  339. SESSION, HEAP, STATE and SENDER parameters.</P>
  340. <UL>
  341. <LI>
  342. _start
  343. <P>Sessions can't start running until the kernel knows they exist.  After
  344. the kernel registers a session, it sends a <STRONG>_start</STRONG> event to let it
  345. know it's okay to begin.  POE requires every state machine to have a
  346. special <STRONG>_start</STRONG> state.  Otherwise, how would they know when to
  347. start?</P>
  348. <P>SENDER contains a reference to the new session's parent session.</P>
  349. <P>ARG0..ARG9 contain parameters as they were given to the session's
  350. constructor.  See POE::Session::new() and POE::Session::create() for
  351. more information.</P>
  352. <P></P>
  353. <LI>
  354. _stop
  355. <P>Sessions receive <STRONG>_stop</STRONG> events when it is time for them to stop.
  356. <STRONG>_stop</STRONG> is dispatched to sessions just before the kernel destroys
  357. them.  The <STRONG>_stop</STRONG> state commonly contains special destructor code,
  358. possibly to clean up things that the kernel doesn't know about.</P>
  359. <P>Sessions stop when they run out of pending state transition events and
  360. don't hold resources to create new ones.  Event-generating resources
  361. include selects (filehandle monitors), child sessions, and aliases.</P>
  362. <P>The kernel's <CODE>run()</CODE> method will return if all its sessions stop.</P>
  363. <P>SENDER is the session that posted the <STRONG>_stop</STRONG> event.  In the case of
  364. resource starvation, this is the KERNEL.</P>
  365. <P>ARG0..ARG9 are empty in the case of resource starvation.</P>
  366. <P></P>
  367. <LI>
  368. _signal
  369. <P>POE sets handlers for most of the signals in %SIG.  The only
  370. exceptions are things which might exist in %SIG but probably
  371. shouldn't.  POE will not register signal handlers for SIGRTMIN, for
  372. example, because doing that breaks Perl on some HP-UX systems.</P>
  373. <P>Signals are propagated to child sessions first.  Since every session
  374. is a descendent of the kernel, posting signals to the kernel
  375. guarantees that every session receives them.</P>
  376. <P>POE does not yet magically solve Perl's problems with signals.
  377. Namely, perl tends to dump core if it keeps receiving signals.  That
  378. has a detrimental effect on programs that expect long uptimes.</P>
  379. <P>There are a few kinds of signals.  The kernel processes each kind
  380. differently:</P>
  381. <P>SIGPIPE causes a <STRONG>_signal</STRONG> event to be posted directly to the session
  382. that is running when the signal was received.  ARG0 contains the
  383. signal name, as it appears in %SIG.</P>
  384. <P>The handler for SIGCHLD and SIGCLD calls <A HREF="../../../lib/Pod/perlfunc.html#item_wait"><CODE>wait()</CODE></A> to acquire the dying
  385. child's process ID and result code.  If the child PID is valid, a
  386. <STRONG>_signal</STRONG> event will be posted to all sessions.  ARG0 will contain
  387. CHLD regardless of the actual signal name.  ARG1 contains the child
  388. PID, and ARG2 contains the contents of $? just after the <A HREF="../../../lib/Pod/perlfunc.html#item_wait"><CODE>wait()</CODE></A> call.</P>
  389. <P>All other signals cause a <STRONG>_signal</STRONG> event to be posted to all
  390. sessions.  ARG0 contains the signal name as it appears in %SIG.</P>
  391. <P>SIGWINCH is ignored.  Resizing an xterm causes a bunch of these,
  392. quickly killing perl.</P>
  393. <P></P>
  394. <LI>
  395. _garbage_collect
  396. <P>The <STRONG>_garbage_collect</STRONG> event tells the kernel to check a session's
  397. resources and stop it if none are left.  It never is dispatched to a
  398. session.  This was added to delay garbage collection checking for new
  399. sessions.  This delayed garbage collection gives parent sessions a
  400. chance to interact with their newly-created children.</P>
  401. <P></P>
  402. <LI>
  403. _parent
  404. <P>The <STRONG>_parent</STRONG> event lets child sessions know that they are about to
  405. be orphaned and adopted.  It tells each child session who their old
  406. parent was and who their new parent is.</P>
  407. <P>SENDER should always equal KERNEL.  If not, the event was spoofed by
  408. another session.  ARG0 is the session's old parent; ARG1 is the
  409. session's new one.</P>
  410. <P></P>
  411. <LI>
  412. _child
  413. <P>The <STRONG>_child</STRONG> event is sent to parent sessions when they acquire or
  414. lose child sessions.  <STRONG>_child</STRONG> is dispatched to parents after the
  415. children receive <STRONG>_start</STRONG> or before they receive <STRONG>_stop</STRONG>.</P>
  416. <P>SENDER should always equal KERNEL.  If not, the event was spoofed by
  417. another session.</P>
  418. <P>ARG0 indicates what is happening to the child.  It is 'gain' if the
  419. session is a grandchild being given by a dying child.  It is 'lose' if
  420. the session is itself a dying child.  It is 'create' if the child was
  421. created by the current session.</P>
  422. <P>ARG1 is a reference to the child session.  It will still be valid,
  423. even if the child is in its death throes.</P>
  424. <P>ARG2 is only valid when ARG0 is 'create'.  It contains the return
  425. value of the child's <STRONG>_start</STRONG> state.  See ABOUT STATES' RETURN VALUES
  426. for more information about states' return values.</P>
  427. <P></P>
  428. <LI>
  429. Select Events
  430. <P>Select events are generated by POE::Kernel when selected file handles
  431. become active.  They have no default names.</P>
  432. <P>ARG0 is the file handle that had activity.</P>
  433. <P></P>
  434. <LI>
  435. _default
  436. <P>The <STRONG>_default</STRONG> state is invoked whenever a session receives an event
  437. for which it does not have a registered state.  If the session doesn't
  438. have a <STRONG>_default</STRONG> state, then the event will be discarded.  If the
  439. session's <STRONG>default</STRONG> option is true, then POE will carp and confess
  440. about the discarded event.</P>
  441. <P>ARG0 holds the original event's name.  ARG1 holds a reference to the
  442. original event's parameters.</P>
  443. <P>If <STRONG>_default</STRONG> catches a <STRONG>_signal</STRONG> event, its return value will be
  444. used to determine if the signal was handled.  This may make some
  445. programs difficult to stop.  Please see the description for the
  446. <STRONG>_signal</STRONG> event for more information.</P>
  447. <P>The <STRONG>_default</STRONG> state can be used to catch misspelled events, but
  448. $session-><CODE>option('default',1)</CODE> may be better.</P>
  449. <P></P></UL>
  450. <P>
  451. <HR>
  452. <H1><A NAME="about states' return values">ABOUT STATES' RETURN VALUES</A></H1>
  453. <P>States are evaluated in a scalar context.  States that must return
  454. more than one value should return an arrayref instead.</P>
  455. <P>Signal handlers tell POE whether or not a signal was handled by
  456. returning a logical true or false value.  See the description for the
  457. <STRONG>_signal</STRONG> state for more information.</P>
  458. <P>POE::Kernel::call() will return whatever a called state returns.  See
  459. the description of POE::Kernel::call() for more information.</P>
  460. <P>If a state returns a reference to an object in the POE namespace (or
  461. any namespace starting with POE::), then that reference is immediately
  462. stringified.  This is done to prevent ``blessing bleed'' (see the
  463. Changes file) from interfering with POE's and Perl's garbage
  464. collection.  The code that checks for POE objects does not look inside
  465. data passed by reference-- it's just there to catch accidents, like:</P>
  466. <PRE>
  467.   sub _stop {
  468.     delete $_[HEAP]->{'readwrite wheel'};
  469.     # reference to the readwrite wheel is implicitly returned
  470.   }</PRE>
  471. <P>That accidentally returns a reference to a POE::Wheel::ReadWrite
  472. object.  If the reference was not stringified, it would delay the
  473. wheel's destruction until after the session stopped.  The wheel would
  474. try to remove its states from the nonexistent session, and the program
  475. would crash.</P>
  476. <P>
  477. <HR>
  478. <H1><A NAME="see also">SEE ALSO</A></H1>
  479. <P>POE; POE::Kernel</P>
  480. <P>
  481. <HR>
  482. <H1><A NAME="bugs">BUGS</A></H1>
  483. <P>The documentation for POE::Session::create() is fairly nonexistent.</P>
  484. <P>
  485. <HR>
  486. <H1><A NAME="authors & copyrights">AUTHORS & COPYRIGHTS</A></H1>
  487. <P>Please see the POE manpage.</P>
  488. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  489. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  490. <STRONG><P CLASS=block> POE::Session - POE State Machine</P></STRONG>
  491. </TD></TR>
  492. </TABLE>
  493.  
  494. </BODY>
  495.  
  496. </HTML>
  497.