One thing I'm not a big fan of is its baked-in database layer, the
Mapper (now in flux and being reborn as Record), and so was pleased to
find the JPA archetype in the 1.1 tree. Using this archetype, you get a
barebones but functioning lift app using pure JPA. This is a great
start, but when I poked around the snippets I saw two things that
troubled me:
The underlying entity manager API leaks directly into what would be the
service layer API; a single object exposed as Model.
The snippet code is hardwired to Model, which uses it directly as a
global DAO.
This archetype is still in development, and it very well may change.
It's carries a nature of being experimental; showing you how it can be
done, but probably not how it should be done.
However, it highlighted an issue I have with Lift, one that the boring
enterprise crowd has solved: dependency injection.
I have an admittedly specific idea in mind for what I want to implement
in my would-be Lift app: I want to be able to declare a few fields and
annotate them so that a layer above will provide me with acceptable
instances. Yeah, I want to inject DAOs in the oh-so-familiar
Guice/Spring/T5 IoC way. I like this partially because it's familiar,
but also because it provides me with loosely coupled code.
There's been some good discussion on the subject of implementing
dependency injection in Scala using mere language constructs. I dove
into this subject, starting with chapter 27 of
[http://www.artima.com/shop/programming_in_scala]: "Modular Programming
Using Objects." It's a good read, and I recommend the book. After that I
found my way to some relevant posts in the blogs of Debasish Ghosh and
Jonas Boner, respectively:
http://debasishg.blogspot.com/2008/02/scala-to-di-or-not-to-di.html
http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di.html
Very cool indeed, but I've slightly digressed. What I want to explore is
how to loosely couple the persistence implementation (be it JPA, JDO, or
a baked in model) with the accessing of persistent objects. I don't see
how the aforementioned technique (the "cake" pattern) would help in the
case of lift snippets, because we don't have any kind of hooks where we
can provide configuration of snippets (at least, not that I know of).
This is exactly the issue that DI solves.
So what are the thoughts of the lift-power users? Is there a way to get
this in lift, or would you say that I am doing it wrong?
sincerely,
chris
> I am specifically talking about decoupling my web logic, ie, event
> handlers for forms in lift snippets, from the persistence layer. As
> currently implemented, snippets know exactly what persistence mechanism
> is in use because there is no intermediary API.
Chris, I'm sharing the same concerns as you about the decoupling. For
now, I've just accepted it to get started with Lift.
But now that our app starts to grow, I think we'll need to find a
good solution for this in order to
1) Maintain a good test suite (I'm a strong believer in TDD and
automated testing in general. I don't think that having type safety and
FP makes tests obsolete).
2) Loosely couple the code to make it maintainable over time
One of my big issues right now is how to test snippets that access the
persistence/business layer. This is trivial if snippets has some kind of
DI, as you could just inject mock objects instead of the real
thing. Alas, I haven't found a good solution yet. I do think that Scala
provides some language support for this (ie. the articles you linked to)
and I would like to pursue this first, before using more heavyweight
solutions such as Spring/Guice etc.
/Jeppe
I like the Lift framework. It has its rough edges, but it's a great way
to get into web app development using scala. It borrows many good ideas
from other frameworks, most notably its convention over configuration
structure (rails) and its scriptless view layer (wicket).
One thing I'm not a big fan of is its baked-in database layer, the
Mapper (now in flux and being reborn as Record), and so was pleased to
find the JPA archetype in the 1.1 tree. Using this archetype, you get a
barebones but functioning lift app using pure JPA. This is a great
start, but when I poked around the snippets I saw two things that
troubled me:
The underlying entity manager API leaks directly into what would be the
service layer API; a single object exposed as Model.
The snippet code is hardwired to Model, which uses it directly as a
global DAO.
This archetype is still in development, and it very well may change.
It's carries a nature of being experimental; showing you how it can be
done, but probably not how it should be done.
However, it highlighted an issue I have with Lift, one that the boring
enterprise crowd has solved: dependency injection.
I have an admittedly specific idea in mind for what I want to implement
in my would-be Lift app: I want to be able to declare a few fields and
annotate them so that a layer above will provide me with acceptable
instances. Yeah, I want to inject DAOs in the oh-so-familiar
Guice/Spring/T5 IoC way. I like this partially because it's familiar,
but also because it provides me with loosely coupled code.
There's been some good discussion on the subject of implementing
dependency injection in Scala using mere language constructs. I dove
into this subject, starting with chapter 27 of
[http://www.artima.com/shop/programming_in_scala]: "Modular Programming
Using Objects." It's a good read, and I recommend the book. After that I
found my way to some relevant posts in the blogs of Debasish Ghosh and
Jonas Boner, respectively:
http://debasishg.blogspot.com/2008/02/scala-to-di-or-not-to-di.html
http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di.html
Very cool indeed, but I've slightly digressed. What I want to explore is
how to loosely couple the persistence implementation (be it JPA, JDO, or
a baked in model) with the accessing of persistent objects. I don't see
how the aforementioned technique (the "cake" pattern) would help in the
case of lift snippets, because we don't have any kind of hooks where we
can provide configuration of snippets (at least, not that I know of).
This is exactly the issue that DI solves.
So what are the thoughts of the lift-power users? Is there a way to get
this in lift, or would you say that I am doing it wrong?
sincerely,
chris
> Chris,
>
> I agree with Marius' comments. By using Scala's functions and partial
> functions, I have not found any need for Dependency Injection or many of the
> other Java limitation workaround patterns.
>
> Snippets are not associated in any way with persistence. Snippets can work
> any way you want and are not tied to a particular mechanism for storing
> data. Snippets are simply a way to transform XML to XML.
David. I'm also struggling with some of these issues, mostly due to the
fact that I need to supply mocks for testing and not so much because I
crave another layer of indirection :-)
I think what Chris was talking about was not so much that snippets are
tied to any specific persistence mechanism, but more that many (most?)
snippets, to do something useful, needs to access some functionality in
the business logic. An using a static reference for this makes it
difficult to swap BL implementations (ie with mocks). In an IoC
container, those dependencies would be injected automatically to the
snippet.
I'm unsure how this could be implemented in Lift/Scala but would prefer
to use the language itself. Chris already showed one possible solution
with implicits, but I think there may be better solutions out there. I
agree with you on your view on annotations :-)
I feel I have a pretty good grasp on using FP "in the small" e.g for
algorithms and data structures, but can't yet see how FP constructs
(partial functions etc) can be used "in the large" e.g. for composing
whole applications. Even more so when combining this with scala's
powerful type system.
> Scala's traits used in conjunction with runtime logic singletons (e.g.,
> LiftRules and S in Lift) mean that you don't need DI or other stuff. How
> can these things be used together?
One of my issues wrt to testing lift apps is actually the use of these
singletons. Much of my application code relies on these and requires an
elaborate setup to test properly. I can of course extract my own traits
for all the functionality that I use in S, LiftRules etc. but this seems
like something that could be integrated into lift proper. I'll spend
some more time on this and get back when/if I have some suggested
improvements :-)
> I don't believe snippets need this kind of configuration if you follow the
> same patterns as we've followed with LiftRules and S.
Could you briefly mention these patterns (or point to the code :-)?
There's a lot of code in there and, while readable, I don't think I can
distill the patterns yet....
/Jeppe
David,
I'm still investigating options, but I wanted to restate my main issue
simply. It is the requirement snippets have on global data; that is it.
The way they receive data from and expose data to templates is really
nice. However, without the use of global objects (including lift
infrastructure like S, as well as application-level services), a snippet
cannot do anything useful. Instead of expressing dependencies via
constructor or function arguments, snippets must reach out.
Calls to
factories provide a way to ask for dependencies, but again binds the
snippet to a specific factory (which in turn requires dependencies be
configured such that a specific factory can provide them).
I see this as problematic. I don't want spring in the mix, and I share
the disdain for java annotations in scala - but there has to be a better
way than globals.
David. I'm also struggling with some of these issues, mostly due to the
David Pollak <feeder.of...@gmail.com> writes:
> Chris,
>
> I agree with Marius' comments. By using Scala's functions and partial
> functions, I have not found any need for Dependency Injection or many of the
> other Java limitation workaround patterns.
>
> Snippets are not associated in any way with persistence. Snippets can work
> any way you want and are not tied to a particular mechanism for storing
> data. Snippets are simply a way to transform XML to XML.
fact that I need to supply mocks for testing and not so much because I
crave another layer of indirection :-)
I think what Chris was talking about was not so much that snippets are
tied to any specific persistence mechanism, but more that many (most?)
snippets, to do something useful, needs to access some functionality in
the business logic. An using a static reference for this makes it
difficult to swap BL implementations (ie with mocks). In an IoC
container, those dependencies would be injected automatically to the
snippet.
I'm unsure how this could be implemented in Lift/Scala but would prefer
to use the language itself. Chris already showed one possible solution
with implicits, but I think there may be better solutions out there. I
agree with you on your view on annotations :-)
I feel I have a pretty good grasp on using FP "in the small" e.g for
algorithms and data structures, but can't yet see how FP constructs
(partial functions etc) can be used "in the large" e.g. for composing
whole applications. Even more so when combining this with scala's
powerful type system.
One of my issues wrt to testing lift apps is actually the use of these
> Scala's traits used in conjunction with runtime logic singletons (e.g.,
> LiftRules and S in Lift) mean that you don't need DI or other stuff. How
> can these things be used together?
singletons. Much of my application code relies on these and requires an
elaborate setup to test properly. I can of course extract my own traits
for all the functionality that I use in S, LiftRules etc. but this seems
like something that could be integrated into lift proper. I'll spend
some more time on this and get back when/if I have some suggested
improvements :-)
Could you briefly mention these patterns (or point to the code :-)?
> I don't believe snippets need this kind of configuration if you follow the
> same patterns as we've followed with LiftRules and S.
There's a lot of code in there and, while readable, I don't think I can
distill the patterns yet....
/**
* Returns the Locale for this request based on the LiftRules.localeCalculator
* method.
*
* @see LiftRules.localeCalculator(HTTPRequest)
* @see java.util.Locale
*/
def locale: Locale = LiftRules.localeCalculator(containerRequest)
/*** A function that takes the current HTTP request and returns the current*/var localeCalculator: Box[HTTPRequest] => Locale = defaultLocaleCalculator _def defaultLocaleCalculator(request: Box[HTTPRequest]) =request.flatMap(_.locale).openOr(Locale.getDefault())
LiftRules.localeCalculator = request => User.currentUser.map(_.locale.is) openOr LiftRules.defaultLocaleCalculator(request)
/Jeppe
> Take a payment service example. I start off with PayPal and some
> months later I switch my processor to CyberSource. I don't want to tie
> the snippet to a specific processor, so my mind, transposing java,
> says to write a payment service interface and implementation (of
> course there's a DI container that manages the wiring). In scala, if I
> mixin a trait that provides the payment service implementation, I
> still have to change the trait being mixed in if I want a different
> implementation.
But how is that different from e.g changing a bean name in a Spring
configuration (it's been a while since I used Spring, things may have
changed :-)
> That, or have the trait itself resolve the implementation, which is
> plumbing that would have to be repeated per dependency-bearing trait.
I you need the same dependency injected in several places, you could
create a Configuration trait that holds all your dependencies (akin to
the Spring context). Granted, this will provide all your services to all
snippets, which seems less than ideal.....
This is an interesting discussion, and I'm still pondering at a good
solution to the above.
/Jeppe
> How can it be tested with different implementations? I change the trait
> being extended when I run tests, then change back for deployment (that
> is, change the actual source)? A spring context isn't compiled into the
> code, so I can simply change the context being used and I have my
> different implementations.
>
> I DO NOT want this. I want to understand the trait example as I'm sure
> I'm missing something.
I think it's the fact that traits are stackable. I'm still exploring
solutions, but this example shows that at least testing is possible
without changing the source (See the full example here:
http://gist.github.com/179733 )
def main(args : Array[String]) : Unit = {
// Real config
(new MySnippet).render
(new YourSnippet).render
// Do test
(new MySnippet with MockConfiguration).render
}
yields:
Rendering my snippet
CyberSource payment for my stuff in CyberSourcePaymentService$CyberSourceImpl@3ba42792
Rendering your snippet
Doing it with MyDepImpl and paying it
CyberSource payment for MyDepImpl in CyberSourcePaymentService$CyberSourceImpl@2bd1e730
Rendering my snippet
Mock payment for my stuff in MockConfiguration$MockImpl@148238f4
One issue with this solution, as I wrote earlier is that all snippets
have access to all services in the Configuration, not just the declared
dependencies (which are actually superfluous :-(
/Jeppe
Ok, I had never looked at the source for S or LiftRules, but just poked
around in S and some dots connected. Assign different functions to the S
var members and you change functionality. Cool! Different than what my
mind defaults to, but so simple.
(You can see I have some baggage, and I am happy to let it go.)
Forgive my ignorance, and this issue probably has more to do with my
newness to scala rather than lift, but I don't see how your trait
example allows one to "construct" the snippet. Take a payment service
example. I start off with PayPal and some months later I switch my
processor to CyberSource. I don't want to tie the snippet to a specific
processor, so my mind, transposing java, says to write a payment service
interface and implementation (of course there's a DI container that
manages the wiring). In scala, if I mixin a trait that provides the
payment service implementation, I still have to change the trait being
mixed in if I want a different implementation. That, or have the trait
itself resolve the implementation, which is plumbing that would have to
be repeated per dependency-bearing trait.
This sounds messy and like a maintenance headache - I feel like I'm
missing your point here. I get the answer to "mocking" lift internals,
but hot-swapping service implementations without incurring a maintenance
hit is still unclear. Thanks again!
On Wed, Sep 2, 2009 at 11:39 AM, David
Pollak<feeder.of...@gmail.com> wrote:
>
> Let's say we're running in test mode, in Boot.scala:
> if (Props.testMode) {
> MyAppRules.paymentGateway = () => MockPaymentGateway
> }
In order to test in isolation, production code should never have to
have any idea that mock classes might exist. In most cases, they don't
- the mock is a dynamic proxy that has expectations configured on it
*in the test case*.
Dependency injection can be used to do configuration at any level of
granularity, not just at the "global config" level that is Boot.scala.
This is the whole reason the enterprise world has rejected singletons,
because any code that uses such a singleton cannot be tested in
isolation without messing with a class that may be largely irrelevant
to the functionality being tested. If the only dependencies that an
object has are provided through constructor parameters, any and all
external state that the object depends upon can be trivially mocked
simply by passing in different parameters.
With respect to Tim's comment, with Guice you usually don't use a
configuration file; your configuration is in code. In a test case, you
create an Injector using a set of modules that have the "rules" for
object creation (specifications for what type or instance of object is
to be injected in any given position) and then you use this Injector
as your factory. In a production system, the process is exactly the
same - but you create the Injector with a different set of modules.
In reading this thread, I can't help but to wonder... how extensively
have those of you who are purporting traits and partial functions to
be a replacement for DI actually used a modern dependency injection
framework?
Kris
I think that the following really misses the point of dependency injection:
In order to test in isolation, production code should never have to
On Wed, Sep 2, 2009 at 11:39 AM, David
Pollak<feeder.of...@gmail.com> wrote:
>
> Let's say we're running in test mode, in Boot.scala:
> if (Props.testMode) {
> MyAppRules.paymentGateway = () => MockPaymentGateway
> }
have any idea that mock classes might exist. In most cases, they don't
- the mock is a dynamic proxy that has expectations configured on it
*in the test case*.
Dependency injection can be used to do configuration at any level of
granularity, not just at the "global config" level that is Boot.scala.
This is the whole reason the enterprise world has rejected singletons,
because any code that uses such a singleton cannot be tested in
isolation without messing with a class that may be largely irrelevant
to the functionality being tested.
If the only dependencies that an
object has are provided through constructor parameters, any and all
external state that the object depends upon can be trivially mocked
simply by passing in different parameters.
With respect to Tim's comment, with Guice you usually don't use a
configuration file; your configuration is in code. In a test case, you
create an Injector using a set of modules that have the "rules" for
object creation (specifications for what type or instance of object is
to be injected in any given position) and then you use this Injector
as your factory. In a production system, the process is exactly the
same - but you create the Injector with a different set of modules.
In reading this thread, I can't help but to wonder... how extensively
have those of you who are purporting traits and partial functions to
be a replacement for DI actually used a modern dependency injection
framework?
Kris
My point is that Boot is part of the production codebase, and as such
it should be entirely ignorant of the test harness.
>> Dependency injection can be used to do configuration at any level of
>> granularity, not just at the "global config" level that is Boot.scala.
>
> And my example above allowed for configuration at any level (well... the
> example didn't include 'current request' but that's a change from SessionVar
> to RequestVar)
But can you test a snippet in the absence of references to RequestVar,
SessionVar, S, and the rest of Lift if the snippet makes calls to such
objects? I don't want to have to set up the state of a Req having been
processed through a RewriteRequest and so on to create an environment
for my snippet to run in.
>> This is the whole reason the enterprise world has rejected singletons,
>> because any code that uses such a singleton cannot be tested in
>> isolation without messing with a class that may be largely irrelevant
>> to the functionality being tested.
>
> I guess this is where our philosophies diverge. I believe in integration
> tests and unit tests of things that deal with untyped data (Strings). Most
> other forms of testing tend in my experience to be pointless: they take lots
> of time to write and run and yield very few delta defects.
I guess I'm just not that good; I miss boundary cases in my algorithms
on a not-too infrequent basis, particularly when there's a large state
space that the configurations of my persistent data can occupy. I find
unit tests to be extremely helpful, particularly with how often the
requirements I'm trying to satisfy grow and force me to refactor.
What's strange to me is that in my experience, unit tests are quick to
write and run, while integration tests are the ones that are a
nightmare to set up for.
> Additionally, the S pattern looks like a global, but is in fact a front end
> to thread-specific state. Scala's DynamicVar (S sits on top of a DynamicVar
> style pattern) gives you a lot of latitude to have a concrete symbol for
> something with a dynamic meaning for that symbol.
I understand this, but to me thread-local state is little better than
global state, because when you come down to it RequestVar and
SessionVar instances behave like globals within the context of the
request or the session, respectively. If I have multiple snippets on a
page that both happen to mutate the state of a RequestVar without
checking it, code that's ignorant of the order of snippet calls cannot
reliably make any assumptions about said state. This has caused me
bugs that took serious time to track down and in some cases still
aren't fully resolved.
>> If the only dependencies that an
>> object has are provided through constructor parameters, any and all
>> external state that the object depends upon can be trivially mocked
>> simply by passing in different parameters.
>
> I don't understand the difference between having a parameter magically
> passed because on an annotation and making a method call to get a parameter
> that satisfies an interface other than the call is explicit and the
> annotation based mechanism is something that happens by magic where I regard
> magic to be bad.
I guess I feel like dependency injection is a declarative approach,
which I prefer to the imperative method call. Ultimately, the
significant question is what is allowed to configure how that method
call responds; if there are several layers of framework (Boot, S,
RequestVar, etc.) between the configurer and the configuree I don't
have confidence that the state I'm trying to establish wont get mucked
up along the way. DI is hardly magic; it's just a matter of having a
piece of code that will calculate a dependency graph for you then find
the correct objects to plug in from a flat scope to establish the
state of the object you request.
>> With respect to Tim's comment, with Guice you usually don't use a
>> configuration file; your configuration is in code. In a test case, you
>> create an Injector using a set of modules that have the "rules" for
>> object creation (specifications for what type or instance of object is
>> to be injected in any given position) and then you use this Injector
>> as your factory. In a production system, the process is exactly the
>> same - but you create the Injector with a different set of modules.
>
> So, you've got code that makes a determination about how to be a factory for
> a given interface under a specific circumstance, which sounds a lot like
> what I'm proposing.
The difference is that in your example, it eventually all devolves to
the MyAppRules object, and if you want to make a change to the gateway
that is used you have to change MyAppRules itself rather than supply a
different instance of a class conforming to the MyAppRules interface.
There are other issues - take the example of choosing the payment
gateway based upon locale. What if there are other factors you want to
choose based upon - say the part of the application that the gateway
is being called from? With the DI solution, that part of the
application simply instantiates its own injector with the correct
configuration; with your solution, MyAppRules then becomes coupled to
some notion about who its caller is.
>> In reading this thread, I can't help but to wonder... how extensively
>> have those of you who are purporting traits and partial functions to
>> be a replacement for DI actually used a modern dependency injection
>> framework?
>
> I'm all for a discussion and even disagreement that's based on code and code
> examples. I'm not keen on insulting other people because their views and
> experience differs from yours.
I'm surprised you found my question insulting, and if you took it as a
slight I apologize, but I was actually honestly wanting to know, not
trying to score some sort of point. I know that my understanding of
the utility of DI was seriously flawed until I had used Guice in a
large project and discovered how simple it made testing for me. I
realize now based upon what you said above that you don't really find
unit testing to be of value, so I can see how these issues are not as
important to you.
Kris
It's "mockito" - http://mockito.org/ which looks like EasyMock (what
I've used most) except that the interfaces are a bit more fluent and
mockito allows mocking of concrete classes, not just interfaces.
Kris
How is:
class Foo(snippetConstructors: XX) extends Snippet {}
Any more abstract than:
class Foo with MyProjectState {}
where:
trait MyProjectState { def snippetConstructor: XX}
As usual, when people have different axioms communication is difficult
because such axioms tend to be assumed common when they really
probably are not.
Kris
@injectclass Snippet(someState: State) {def transform(in: NodeSeq): NodeSeq = ...}Set up test injectionstestSnippet
class Snippet {lazy val someState = myState.is}
S.init(mockSession) {myState.doWith(mockValue) {testSnippet}}
> Additionally, the S pattern looks like a global, but is in fact a front endI understand this, but to me thread-local state is little better than
> to thread-specific state. Scala's DynamicVar (S sits on top of a DynamicVar
> style pattern) gives you a lot of latitude to have a concrete symbol for
> something with a dynamic meaning for that symbol.
global state, because when you come down to it RequestVar and
SessionVar instances behave like globals within the context of the
request or the session, respectively. If I have multiple snippets on a
page that both happen to mutate the state of a RequestVar without
checking it, code that's ignorant of the order of snippet calls cannot
reliably make any assumptions about said state. This has caused me
bugs that took serious time to track down and in some cases still
aren't fully resolved.
I guess I feel like dependency injection is a declarative approach,
>> If the only dependencies that an
>> object has are provided through constructor parameters, any and all
>> external state that the object depends upon can be trivially mocked
>> simply by passing in different parameters.
>
> I don't understand the difference between having a parameter magically
> passed because on an annotation and making a method call to get a parameter
> that satisfies an interface other than the call is explicit and the
> annotation based mechanism is something that happens by magic where I regard
> magic to be bad.
which I prefer to the imperative method call. Ultimately, the
significant question is what is allowed to configure how that method
call responds; if there are several layers of framework (Boot, S,
RequestVar, etc.) between the configurer and the configuree I don't
have confidence that the state I'm trying to establish wont get mucked
up along the way. DI is hardly magic; it's just a matter of having a
piece of code that will calculate a dependency graph for you then find
the correct objects to plug in from a flat scope to establish the
state of the object you request.
The difference is that in your example, it eventually all devolves to
>> With respect to Tim's comment, with Guice you usually don't use a
>> configuration file; your configuration is in code. In a test case, you
>> create an Injector using a set of modules that have the "rules" for
>> object creation (specifications for what type or instance of object is
>> to be injected in any given position) and then you use this Injector
>> as your factory. In a production system, the process is exactly the
>> same - but you create the Injector with a different set of modules.
>
> So, you've got code that makes a determination about how to be a factory for
> a given interface under a specific circumstance, which sounds a lot like
> what I'm proposing.
the MyAppRules object, and if you want to make a change to the gateway
that is used you have to change MyAppRules itself rather than supply a
different instance of a class conforming to the MyAppRules interface.
There are other issues - take the example of choosing the payment
gateway based upon locale. What if there are other factors you want to
choose based upon - say the part of the application that the gateway
is being called from? With the DI solution, that part of the
application simply instantiates its own injector with the correct
configuration; with your solution, MyAppRules then becomes coupled to
some notion about who its caller is.
I'm surprised you found my question insulting, and if you took it as a
>> In reading this thread, I can't help but to wonder... how extensively
>> have those of you who are purporting traits and partial functions to
>> be a replacement for DI actually used a modern dependency injection
>> framework?
>
> I'm all for a discussion and even disagreement that's based on code and code
> examples. I'm not keen on insulting other people because their views and
> experience differs from yours.
slight I apologize, but I was actually honestly wanting to know, not
trying to score some sort of point. I know that my understanding of
the utility of DI was seriously flawed until I had used Guice in a
large project and discovered how simple it made testing for me.
I
realize now based upon what you said above that you don't really find
unit testing to be of value, so I can see how these issues are not as
important to you.
Kris