| Requirements
					 | Assertions & Questions
					 | 
				
					| Parser
					 | 
				
					| XML Support | Assertions:
						 
							We can not use the XML::Parser module to parse XML pages.
							The current XML parsers for perl (based on XML::Parser which uses the C expat library)
							will not parse the HTML in XPML pages, making it useless as the core parser of XPP.
							
							The standard syntax will look like: <XPP TAG KEY1="VALUE"
							KEY2="VALUE" /> 
							For just parsing perl we'll use <XPP>PERL</XPP>
							For printing we'll use <XPR> PRINT </XPR>
						 Questions:
						 
							If we can not use the official XML parser, we should make sure our parser code
							is abstracted so that we could one day rewrite it in C or use the XML parser later.
							Writing the parser in C is an option, but using an XML parser
							doesn't seem likely. An XML parser will always have a problem with HTML that is used
							in XPML pages.
 | 
				
					| The XPP Parser must be very fast. | Assertions: The speed of execution is more imporatnt then the speed of parsing.
 | 
				
					| XPML Compilation at the Apache Parent Level | Assertions:
						 
							There should be a way to tell XPP when it is loaded into Apache, what pages is
							should compile. These can then be 'shared' by all subprocs.
							All new features should be compatable with this approach. For instance, pre-compiling
							of code doesn't work (remember <?= ?>
						 | 
				
					| XPML Pages should be cached in memory | Assertions:
						 
							Each time an XPML or included XMI file is requested, XPP should check that files
							mtime to see if it has been modified and recompile it if it has.
							XPML pages will be cached in memory as objects that contain coderefs?
						 Questions:
					 | 
				
					| There should be a way of turning off the 'stat'ing of files. | Assertions:
						 
							There should be a PerlSetVar flag to tell XPP to not check files for their modification
							time. This will dramatically speed requests up.
							This will require restarting the web server when changes to pages are made.
							Sharing would increase if stating was off, because cached,
							compiled pages would never need re-compiling, so would stay shared in the parent
							proc. 
						 Questions:
					 | 
				
					| Includes
					 | 
				
					| There needs to be a way of including dynamic AND static files | Assertions
						 
							there are xinclude (dynamic) and include (static) methods for including files.
							Includes will be relative to the XPPincroot. 
							There should be the ability to include and xinclude URLs
							as well.
							Included files will be in their own scope. 
						 Questions
						 
							How could you xinclude a URL?  An external code source (i.e., a web server which serves XMIs without parsing?)
						 | 
				
					| There should be a way of including files from within the web root. | Questions
						 
							This is currently supported, but only be letting the user type system rooted
							paths. This seems like a security hole. A better system should be thought of.
						 | 
				
					| There needs to be a way of passing parameters between includes. | Assertions
						 
							The second to Nth paramater you can pass the xinclude method will be the other
							variables you want to pass to that template. 
							There should be a way to force a named variable into the
							scope of an include? This would save XPML programmers from having to shift() variables
							into the include, allowing them to use variables that are 'already there.' 
						 Questions
					 | 
				
					| There should be a way to include a file within the same namespace. | Assertions:
						 
							There should be an option of copying the code into the current page's code. Another
							reason this wasn't done before was because there was no way of knowing when an xmi
							had changed (in order to reload it), if the code was just copied in verbatim. Each page object could contain an array of files (or other expiry
							means) which would invalidate the cache if any failed an mtime test. 
							There should be an option of copying the code from an included file into the
							current page's code. When the page is included (in this special way) it can be put
							in an if block which checks that files mtime. Each page object could contain an array of files (or other
							expiry means) which would invalidate the cache if any failed an mtime test.
 Questions
						 
							Is it possible to have the code in memory only once, but be scoped to whomever
							is calling it? Although the no scope; pragma has been suggested on p5p (a cool feature, I might add!),
							there is no way that I know of to do this currently.
Even if the above isn't possible, there should still be an option of copying
							the code into the current page's code. Another reason this wasn't done before was
							because there was no way of knowing when an xmi had changed (in order to reload it),
							if the code was just copied in verbatim. I think this too can be solved with creative
							code. When the page is included (in this special way) it can be put in an if block
							which checks that files mtime. Each page object could contain an array of files (or other
							expiry means) which would invalidate the cache if any failed an mtime test.
Would this require a two-pass parsing approach? I don't believe so.
 | 
				
					| There should be a TAG (non-perl) syntax for doing includes and passing parameters
						to includes. | SEE XPP TAGS | 
				
					| Included files should be cached once per process, not once per include. | Assertions:
						 
							Each XPP xpml or xmi will be stored in global memory with a timestamp. Each time
							someone or a page requests another xpml object it should look in this global memory
							space. 
						 
					 | 
				
					|  |  | 
				
					| XPP Tags
					 | 
				
					| There should be a way of executing of using TAGS instead of pure perl to get things
						done in XPP. | Assertions:
						 
							Tags need to be extensible, ie. There needs to be an easy way of adding tag functions.
							When a new tag is created, there should be a way of telling XPP what keynames
							are required for that tag.
							tags map to actual methods (which can overloaded).
							Project Specific modules for defining tags
						 Questions:
						 
							Ask XPML authors what they're common tasks are.
						 | 
				
					| Using TAGS should not slow down execution. | Assertions
						 
							The parser will just replace the tags with valid perl so there would be no difference
							using or not using the tags.
						 | 
				
					| Tags should be XML compliant. | Assertions
						 
							Even if we can not use the XML parser we should make the
							tags as XML compliant as possible for the future. <XPP TAG
							ARG1="VALUE" ARG2="VALUE" />
 | 
				
					| There still needs to be a way to embed Perl in tags. | Assertions
						 
							The XML compatable syntax used for TAGS will probably not be best for just embedding
							perl in.
							<XPP> CODE... </XPP>
						 Questions 
					 | 
				
					| There still needs to be a way of printing perl within tags. | Assertions
						 
							Same considerations as above.
							<XPR> PRINT </XPR>
							Print does not need a semicolon.
						 Questions
					 | 
				
					| Query Param Tags | AssertionsNeed tags for the following:
 
							Getting query params.
							Checking for the existence of Query Params.
							Testing the value of query params. 
						 Questions
						 
							What other query operations should we make tags for? 
							Do we really need tags? Query params are most useful inside PRINTs or conditionals.  Should be just a built-in method.
						 | 
				
					| Loop Tags | AssertionsNeed tags for the following:
 
							Looping through arrays
							Looping through closures (Carbon query objects) 
							An easy way of displaying X of X objects on a page with next and previous buttons.
							
								Initialization of state data based on query object
								Data (Carbon) changes to handle starting at X
								Navigation output generated from initialized state data
							Checking to make sure an object is an object.
							There should be a way, with one set of opening and closing tags to, go itterate through 
							a carbon query object, checking refs as it goes. (Wait for Carbon::query
							objects).
						 Questions
						 
							Restrict the number of iterations of a loop
							What other loop operations should we make tags for?
						 | 
				
					| Objects | AssertionsNeed tags for the following:
 
							Calling methods against the APP object and getting their return.
							Printing methods (vars) of objects.
							 <XPP OBJ="$a" ATTR="name" />
							listing objects... There needs to be a standard way of getting and generating
							a list of objects, be it an HTML linked list, a scrolling list, a popup menu etc...
							Printing methods against the app object. 
						 Questions
						 
							What other object operations should we make tags for?
						 | 
				
					| Other | AssertionsNeed tags for the following:
 
							FLOW CONTROL if statements... (not sure about this one)
							creating vars, setting vars (???)
							Shifting variables in (at the top of xmi's)
							xincludes
							iterative xinclude (given a list and an xinclude it will xinclude once for each
							item in the list) 
							<XPP INCLOOP="inc.xmi" ON="$query" />
						 Questions
						 
							What other operations should we make tags for?
						 | 
				
					| Comment | Assertions
						 
							Comment tag.. tag should have opening and closing which says anything in between
							should be ignored by the parser. This is important when commenting out code so the
							code doesn't show up in the outputted HTML. 
							<XPPCOMMENT>
							... </XPPCOMMENT>
							This will need to balanace tag start and end characters
							(< and >), and end on a balanced XPPCOMMENT tag. This will allow for commenting
							of code that zero or more XPPCOMMENT tags.
						 | 
				
					| Form | Assertions
						 
							Need tags for the following:
							
								INPUT Tags
								SELECT Tags
								Begin/End Form
							XPML authors should be able to send other key value pairs to form tags which
							just get passed through to the HTML. 
							There needs to be a way for the XPML author to specify standard validation information
							per form field. They should be able to specify multiple validation params per form
							field.
							XPP Form tags should know to populate themselves with whats in the query object
							unless overridden. 
							We should use the HTML_* methods from Chromium to make creating these dynamic
							forms easier. Should we move those HTM_ methods to a library outside of Chromium
							to be used by all the modules. 
							For SELECT loops there should be an easy way of passing an array or Carbon closure
							or query object to a SELECT loop to have it generated for them. <XPP SELECT MULTIPLE="yes"
							SIZE="5" TITLE="Choose One... Please" FROM="$query"
							 NAME="title" VALUE="id"  />
For VALIDATION there should be some standard validation items the XPML author
							can use, like ISDATE or ISNOTNULL, but there needs to be a flexible system for adding
							VALIDATION CONSTRAINTS. The XPML author should NOT be assumed to know these things
							though, so there needs to be a way for XPP, through introspection into the Display
							objects to gain information about how a certain field wants itself to be validated.
							 XPP could only do the validation itself using JavaScript since it won't know where
							they are submitting to.
							The above makes me believe we should standardize the get_ and list_objects methods.
							XPP should be able to look through the document to find out what 'vars' of each object
							they will be printing and make sure the correct vars are retrieved in the select
							for that object.  A one pass parsing phase would collect information
							on which fields will be used, and in post-parsing modify the fields through a reference
							to the fields array which resides in the XPP page object's closure. 
						 Questions
						 
							What other form tags should we make xpml tags for?
							Is there a way we could have the lazy XPML author surround an entire form with
							begining and ending XPML tags and have XPP assume each form tag in between is a dynamic
							form tag. IE. assuming there was an <XPP input...> tag we would let the XPML
							author do <XPP FORMBEGIN> <INPUT TYPE...></FORMEND> and it would
							assume or translate that <INPUT into <XPP INPUT>
						 | 
				
					| Filter Tags | Assertions:
						 
							The idea is to be able to have <FILTERTAG>content</FILTERTAG> and
							you could somehow change whats between the tags with the filter.... Is it too crazy?
						 | 
				
					| Caching
					 | 
				
					| XPP should be able to cache content in a flexible manner. | Assertions:
						 
							There should be a DBI/DBD model for choosing how the data is stored, retrieved,
							and deemed to be expired.
 The following suggested Store's should be supported
Caching needs it's own table to associate caches (name/group
							paris) to the appropriate Store and expiry
							Most expiries would need only the name and group of the
							cache. Other information might be needed as implementations of new expiries are added.
							
							By using a cache tag in which the author would specify
							store and expiry types, the caching code in XPP should be able to handle everything.
							 <XPP CACHE NAME="topheader" GROUP="nav"
							STORE="DB" EXPIRE="time" TIME="5m"> ... </XPP CACHE> 
						 Questions
					 | 
				
					| There needs to be a flexible way for checking to see if a cache has expired. | Assertions:
						 
							XPP::Cache would inherently create, modify, and remove
							both Store and Expiry entities as necessary (both Store and Expiry parameters would
							be passed to XPP::Cache methods). 
							The following suggested Expiry's should be supported:
							
								Time
								Duration
								database flag
								database timestamp
								file non-existant
								file date old
							 Questions:
					 | 
				
					| There needs to be a simple way of populating and re-populated named caches. | Assertions:
						 
							XPP::Cache table rows could have a flag for a cache-transaction
							in progress. 
						 NotesWhen a cache is deemed to be expired, someone has to repopulate it. In an ideal
						world, the first person to see that it was expired would begin a 'transaction' somehow
						to repopulate it... subsequent requests that occur while the first request is being
						processed will see that its expired, see that they can't repopulate it because it
						is locked and just generate the dynamic content themselves. Once the process repopulating
						the cache is done, it has to reset the expiry and unlock the cache.
 Obviously this is easier to do with database caches then other caches. It leads me
						to believe we need to have a suggested Store and Expiry architecture that has to
						deal with issues such as repopulating and locking.
 | 
				
					| There needs to be a flexible way of deciding WHAT to cache. | Assertions
 Questions
 Possible places to specify what to cache:
 
							Top of page to be cached.
							In xinclude
							surounding content.
						 Ideally you would be able to define the cache in an xinclude tag, or maybe just
						at the top of an xincluded page. It would also be nice to be able to enclose text
						and perl on a given XPML page with other tags which tell it to cache whats in between,
						like (bad example)...<?xpp start_cach(options)?>
 stuff, stuff, <?=morestuff?>
 <?xpp end_cache(options)?>
 | 
				
					|  |  | 
				
					| Debugging
					 | 
				
					| Script Checker | Assertions: There should be a script checker which can go through pages and look for common
						errors. Common errors include, no ref checking, global vars, etc..
 | 
				
					| Source Viewer | Assertions:
						 
							Ability to see the source code for an entire XPML with its XMIs.
						 | 
				
					| Line Numbers | Questions: There should be a way of knowing what true line number an error occured on.
 Having errors report accurate line numbers is impossible.
 | 
				
					| Clean Errors |  | 
				
					| Trace Mode |  | 
				
					| Other
					 | 
				
					| Sub-request support | Questions Possibly for Java Servlet Support.  This might sound completely insane, but I think there is a way to 'include' java
						servlets using Apache. That would be an pretty usefull tool.
 | 
				
					|  |  |